home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / fcntl.c.bak < prev    next >
Text File  |  1991-12-04  |  3KB  |  164 lines

  1. /* 
  2.  * fcntl.c --
  3.  *
  4.  *    Procedure to map the Unix fcntl system call to Sprite.
  5.  *
  6.  * Copyright 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  */
  9.  
  10. #ifndef lint
  11. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/fcntl.c,v 1.4 91/12/04 14:43:13 jhh Exp $ SPRITE (Berkeley)";
  12. #endif not lint
  13.  
  14. #include "sprite.h"
  15. #include "fs.h"
  16.  
  17. #include "compatInt.h"
  18.  
  19. #include <fcntl.h>
  20. #include <stdio.h>
  21.  
  22. /*
  23.  *----------------------------------------------------------------------
  24.  *
  25.  * fcntl --
  26.  *
  27.  *    Procedure to map from Unix fcntl system call to Sprite Fs_IOControl.
  28.  *
  29.  * Results:
  30.  *    a value depending on the command, or
  31.  *      UNIX_SUCCESS     the call was successful, or
  32.  *      UNIX_ERROR       the call was not successful.
  33.  *                        The actual error code stored in errno.
  34.  *
  35.  * Side effects:
  36.  *    Variable.
  37.  *
  38.  *----------------------------------------------------------------------
  39.  */
  40.  
  41. int
  42. fcntl(fd, cmd, arg)
  43.     int fd;        /* File to operate on. */
  44.     int cmd;        /* Type of command. */
  45.     int arg;        /* Optional argument to the command. */
  46. {
  47.     ReturnStatus status;
  48.     int value;
  49.  
  50.     switch (cmd) {
  51.     case F_DUPFD:
  52.         status = Fs_GetNewID(fd, &arg);
  53.         value = arg;
  54.         break;
  55.  
  56.     case F_GETFD:
  57.         status = Fs_IOControl(fd, IOC_GET_FLAGS, 
  58.                 0, (Address) NULL, 
  59.                 sizeof(value), (Address) &value);
  60.         value = (value & IOC_CLOSE_ON_EXEC) ? 1 : 0;
  61.         break;
  62.  
  63.     case F_SETFD:
  64.         value = IOC_CLOSE_ON_EXEC;
  65.         if (arg & 1) {
  66.         status = Fs_IOControl(fd, IOC_SET_BITS, 
  67.                 sizeof(value), (Address) &value,
  68.                 0, (Address) NULL);
  69.         } else {
  70.         status = Fs_IOControl(fd, IOC_CLEAR_BITS, 
  71.                 sizeof(value), (Address) &value,
  72.                 0, (Address) NULL);
  73.         }
  74.         value = UNIX_SUCCESS;
  75.         break;
  76.  
  77.     case F_GETFL:  {
  78.         int temp;
  79.  
  80.         status = Fs_IOControl(fd, IOC_GET_FLAGS, 
  81.                 0, (Address) NULL, 
  82.                 sizeof(temp), (Address) &temp);
  83.         value = 0;
  84.         if (temp & IOC_APPEND) {
  85.             value |= FAPPEND;
  86.         }
  87.         if (temp & IOC_NON_BLOCKING) {
  88.             value |= FNDELAY;
  89.         }
  90.         if (temp & IOC_ASYNCHRONOUS) {
  91.             value |= FASYNC;
  92.         }
  93.         switch(temp & (IOC_READ | IOC_WRITE)) {
  94.             case IOC_READ :
  95.             value |= O_RDONLY;
  96.             break;
  97.             case IOC_WRITE:
  98.             value |= O_WRONLY;
  99.             break;
  100.             case (IOC_READ | IOC_WRITE) :
  101.             value |= O_RDWR;
  102.             break;
  103.         }
  104.         }
  105.         break;
  106.  
  107.     case F_SETFL:
  108.         value = 0;
  109.         if (arg & FAPPEND) {
  110.         value |= IOC_APPEND;
  111.         }
  112.         if (arg & FNDELAY) {
  113.         value |= IOC_NON_BLOCKING;
  114.         }
  115.         if (arg & FASYNC) {
  116.         value |= IOC_ASYNCHRONOUS;
  117.         }
  118.         status = Fs_IOControl(fd, IOC_SET_FLAGS, 
  119.             sizeof(value), (Address) &value,
  120.             0, (Address) NULL);
  121.         value = UNIX_SUCCESS;
  122.         break;
  123.  
  124.     case F_GETOWN: {
  125.         Ioc_Owner owner;
  126.  
  127.         status = Fs_IOControl(fd, IOC_GET_OWNER, 
  128.                 0, (Address) NULL,
  129.                 sizeof(owner), (Address) &owner);
  130.         if (owner.procOrFamily == IOC_OWNER_FAMILY) {
  131.             value = -owner.id;
  132.         } else {
  133.             value = owner.id;
  134.         }
  135.         }
  136.         break;
  137.  
  138.     case F_SETOWN: {
  139.         Ioc_Owner owner;
  140.  
  141.         if (arg < 0) {
  142.             owner.id = -arg;
  143.             owner.procOrFamily = IOC_OWNER_FAMILY;
  144.         } else {
  145.             owner.id = arg;
  146.             owner.procOrFamily = IOC_OWNER_PROC;
  147.         }
  148.         status = Fs_IOControl(fd, IOC_SET_OWNER, 
  149.                 sizeof(owner), (Address) &owner,
  150.                 0, (Address) NULL);
  151.         value = UNIX_SUCCESS;
  152.         }
  153.         break;
  154.  
  155.     default:
  156.         break;
  157.     }
  158.     if (status != SUCCESS) {
  159.     errno = Compat_MapCode(status);
  160.     return(UNIX_ERROR);
  161.     } 
  162.     return(value);
  163. }
  164.